#include "encoder.h"

#if USE_ENCODE

static int32_t encoder_diff;
static bool encoder_btn_state;


bool get_encoder_btn_state()
{
    return encoder_btn_state;
}

int32_t get_encoder_diff()
{
    return encoder_diff;
}

void set_encoder_diff(int32_t val)
{
    encoder_diff = val;
}

void HAL_GPIO_EXTI_Callback(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)
{
	if ((GPIOx == ENCODER_S_PORT) && (GPIO_Pin == ENCODER_S_PIN))
	{
		encoder_btn_state = HAL_GPIO_ReadPin(ENCODER_S_PORT, ENCODER_S_PIN);
	}
	else if ((GPIOx == ENCODER_A_PORT) && (GPIO_Pin == ENCODER_A_PIN))
	{
		if (HAL_GPIO_ReadPin(ENCODER_B_PORT, ENCODER_B_PIN) == GPIO_PIN_RESET)
		{
			encoder_diff--;
		}
		else
		{
			encoder_diff++;
		}
	}
}

__attribute__((isr)) void GPIOA_IRQHandler(void)
{
 	HAL_GPIO_EXTI_IRQHandler(ENCODER_A_PORT, ENCODER_A_PIN);
	HAL_GPIO_EXTI_IRQHandler(ENCODER_S_PORT, ENCODER_S_PIN);
}

void bsp_encoder_init()
{
	GPIO_InitTypeDef GPIO_InitStruct;
	
	__HAL_RCC_GPIO_CLK_ENABLE();

	GPIO_InitStruct.Pin = ENCODER_A_PIN;
	GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	HAL_GPIO_Init(ENCODER_A_PORT, &GPIO_InitStruct);
	
	GPIO_InitStruct.Pin = ENCODER_B_PIN;
	GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	HAL_GPIO_Init(ENCODER_B_PORT, &GPIO_InitStruct);
	
	GPIO_InitStruct.Pin = ENCODER_S_PIN;
	GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	HAL_GPIO_Init(ENCODER_S_PORT, &GPIO_InitStruct);
	
	HAL_NVIC_SetPriority(GPIOA_IRQn, 0);
	HAL_NVIC_EnableIRQ(GPIOA_IRQn);
}

#endif